from random import randint

from django.http import HttpResponse, JsonResponse

# Create your views here.
from celery_tasks.sms.tasks import send_sms_code
from celery_tasks.sms.yuntongxun.sms import CCP

"""
前端:
    请求验证码uuid 请求函数:generate_image_code
    请求路径:http://ip/image_codes/uuid
后端:
    # 请求: 方式:GET  参数:uuid   路径:image_codes/<uuid>/
    # 逻辑:
    #     1.接收请求(uuid)
    #     2.生成验证码
    #     3.写入redis
    # 响应:
    #     返回给前端HttpResponse(content_type:image/jpeg)
    
    
        
"""
from django.views import View
from libs.captcha.captcha import captcha
class ImageCodeView(View):

    # 请求: 方式:GET  路径:image_codes/<uuid>/
    def get(self,request,uuid):
        # 逻辑:
        #     1.接收请求(uuid)
        #     2.生成验证码 text,image
        text,image = captcha.generate_captcha()
        #     3.写入redis
        from django_redis import get_redis_connection
        connect_redis = get_redis_connection('imagecode')
        connect_redis.setex(uuid, 1000, text)

        # 响应:
        #     返回给前端HttpResponse(content_type:image/jpeg)

        return HttpResponse(image,content_type='image/jpeg')

############################
"""
前端: 
    1.接口文件
        请求方式: GET
        请求地址:   sms_codes/<mobile>/?image_code&image_code_id
        路径参数:mobile
        字符串参数:image_code    image_code_id
后端:
    请求: 三个参数,mobile,image_code,image_code_id
    逻辑:
        1.接收参数
        2.校验参数
        3.验证图片验证码
        4.生成短信验证码
        5.保存短信验证码
        6.发送短信验证码
        7.返回响应
    响应:     code 0成功 400失败 errmsg错误信息
    路由:
        http://www.meiduo.site:8000/mobiles/17515210999/count/
        
"""
"""
避免频繁发送短信
    1.前端发送过来发送短信请求(前端也要在发送和接收时添加判断,输出错误)
    2.判断redis中是否有flag标记
    3.如果没有flag,可以发送短信,并生成flag标记
    4.如果有flag标记,给前端返回响应 401:操作过于频繁
"""
class SmsCodeView(View):
    def get(self,request,mobile):
        # 1.接收参数
        image_code = request.GET.get('image_code')  # 验证码
        image_code_id = request.GET.get('image_code_id')    # uuid

        # 2.校验参数
        if not all([mobile,image_code,image_code_id]):
            return JsonResponse({'code':400,'errmsg':'参数不齐全'})

        # 3.验证图片验证码
        from django_redis import get_redis_connection
        # 连接redis
        redis_cli = get_redis_connection('imagecode')
        redis_image_code = redis_cli.get(image_code_id)     # 通过uuid取得图片验证码
        if redis_image_code is None:    # 如果验证码不存在 返回400
            return JsonResponse({'code':400, 'errmsg':'验证码不存在'})
        # redis中存储的数据为bytes,要转换成字符串,然后转换成小写
        if redis_image_code.decode().lower() != image_code.lower():
            return JsonResponse({'code':400, 'errmsg':'验证码已过期'})

        # 判断sms_flag是否存在
        sms_flag = redis_cli.get('sms_flag_%s'%mobile)
        if sms_flag is not None:
            return JsonResponse({'code':401,'errmsg':'请不要频繁操作短信发送'})

        # 4.生成短信验证码 '%06d'保证6位
        sms_code = '%06d'%randint(0,999999)

        # redis Pipeline 管道技术
        # 管道3步
        # 1.新建一个管道
        pipeline = redis_cli.pipeline()
        # 2.管道收集指令
        # 5.保存短信验证码 setex(手机号,过期时间秒,短信验证码)
        pipeline.setex(mobile, 300, sms_code)

        # 生成sms_flag标记,sms_flag_13333333333,过期时间60秒,值为1
        pipeline.setex('sms_flag_%s' %mobile, 60, 1)
        # 3.管道执行指令
        pipeline.execute()

        # # 5.保存短信验证码 setex(手机号,过期时间秒,短信验证码)
        # redis_cli.setex(mobile,300,sms_code)
        #
        # # 生成sms_flag标记,sms_flag_13333333333,过期时间60秒,值为1
        # redis_cli.setex('sms_flag_%s'%mobile,60,1)

        # 6.发送短信验证码
        # CCP().send_template_sms(手机号,[验证码,过期时间分],模板编号)
        # CCP().send_template_sms(mobile,[sms_code,5],1)


        # # # delay 的参数 等同于 任务（函数）的参数
        send_sms_code.delay(mobile,sms_code)

        # 7.返回响应
        return JsonResponse({'code':0,'errmsg':'成功'})